package com.icen.utils.comm;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * Time Utils Class
 * 
 * @author IcenHan
 * 
 */
public class DateUtils {
	public static final String DATE_FORMAT_HH_MM_SS = "HH:mm:ss";
	public static final String DATE_FORMAT_YYYY_MM_DD = "yyyy-MM-dd";
	public static final String DATE_FORMAT_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
	public static final String DATE_FORMAT_YY_MM_DD_HH_MM_SS = "yy-MM-dd HH:mm:ss";

	private static final int GET_TYPE_YEAR = 1;
	private static final int GET_TYPE_MONTH = 2;
	private static final int GET_TYPE_DAY = 3;
	private static final int GET_TYPE_HOUR = 4;
	private static final int GET_TYPE_MINUTE = 5;
	private static final int GET_TYPE_SECOND = 6;

	/**
	 * 获取当前系统年份
	 * 
	 * @return int
	 */
	public static int getSysYear() {
		return getYear(new Date());
	}

	/**
	 * 获取当前系统月份
	 * 
	 * @return int
	 */
	public static int getSysMonth() {
		return getMonth(new Date()) - 1;
	}

	/**
	 * 获取当前系统日份
	 * 
	 * @return int
	 */
	public static int getSysDay() {
		return getDay(new Date());
	}

	/**
	 * 获取当前系统小时
	 * 
	 * @return int
	 */
	public static int getSysHour() {
		return getHour(new Date());
	}

	/**
	 * 获取当前系统分钟
	 * 
	 * @return int
	 */
	public static int getSysMinute() {
		return getMinute(new Date());
	}

	/**
	 * 获取当前系统秒钟
	 * 
	 * @return int
	 */
	public static int getSysSecond() {
		return getSecond(new Date());
	}

	/**
	 * 获取当前系统毫秒
	 * 
	 * @return long
	 */
	public static long getSysMillis() {
		return getMillis(new Date());
	}

	/**
	 * 获取当前日期是星期几
	 * 
	 * @return int
	 */
	public static int getWeekOfSysDate() {
		return Calendar.getInstance().get(Calendar.DAY_OF_WEEK) - 1;
	}

	/**
	 * 获取当前系统日期:yyyy-MM-dd
	 * 
	 * @return String
	 */
	public static String getSysDate() {
		return getDate(new Date());
	}

	/**
	 * 获取当前系统时间:HH:mm:ss
	 * 
	 * @return String
	 */
	public static String getSysTime() {
		return getTime(new Date());
	}

	/**
	 * 获取当前系统日期和时间:yyyy-MM-dd HH:mm:ss
	 * 
	 * @return String
	 */
	public static String getSysDateAndTime() {
		return getDateAndTime(new Date());
	}

	/**
	 * 获取年份
	 * 
	 * @param date
	 * @return int
	 */
	public static int getYear(Date date) {
		return getSingleDate(date, DateUtils.GET_TYPE_YEAR);
	}

	/**
	 * 获取月份
	 * 
	 * @param date
	 * @return int
	 */
	public static int getMonth(Date date) {
		return getSingleDate(date, DateUtils.GET_TYPE_MONTH) + 1;
	}

	/**
	 * 获取日份
	 * 
	 * @param date
	 * @return int
	 */
	public static int getDay(Date date) {
		return getSingleDate(date, DateUtils.GET_TYPE_DAY);
	}

	/**
	 * 获取小时
	 * 
	 * @param date
	 * @return int
	 */
	public static int getHour(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return getSingleDate(date, DateUtils.GET_TYPE_HOUR);
	}

	/**
	 * 获取分钟
	 * 
	 * @param date
	 * @return int
	 */
	public static int getMinute(Date date) {
		return getSingleDate(date, DateUtils.GET_TYPE_MINUTE);
	}

	/**
	 * 获取秒钟
	 * 
	 * @param date
	 * @return int
	 */
	public static int getSecond(Date date) {
		return getSingleDate(date, DateUtils.GET_TYPE_SECOND);
	}

	/**
	 * 功能描述：返回毫秒
	 * 
	 * @param date
	 *            日期
	 * @return 返回毫秒
	 */
	public static long getMillis(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.getTimeInMillis();
	}

	private static int getSingleDate(Date date, int getType) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		switch (getType) {
		case GET_TYPE_YEAR:
			return calendar.get(Calendar.YEAR);
		case GET_TYPE_MONTH:
			return calendar.get(Calendar.MONTH) + 1;
		case GET_TYPE_DAY:
			return calendar.get(Calendar.DAY_OF_MONTH);
		case GET_TYPE_HOUR:
			return calendar.get(Calendar.HOUR_OF_DAY);
		case GET_TYPE_MINUTE:
			return calendar.get(Calendar.MINUTE);
		case GET_TYPE_SECOND:
			return calendar.get(Calendar.SECOND);
		default:
			return 0;
		}
	}

	/**
	 * 获得几天后的时间
	 */
	public static Date getAfterDate(Date date, int amount) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DATE, amount);
		return cal.getTime();
	}

	/**
	 * 获取指定年的月份的天数
	 * 
	 * @param year
	 * @param month
	 * @return int
	 */
	public static int getDayNumOfMonth(int year, int month) {
		return getDayNumOfMonthByYear(year)[--month];
	}

	/**
	 * 通过年份获取每个月的天数
	 * 
	 * @param year
	 * @return int[]
	 */
	public static int[] getDayNumOfMonthByYear(int year) {
		int[] monthDay = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
			monthDay[1]++;
		return monthDay;
	}

	/**
	 * 判断两个日期相差的时间,默认格式"yyyy-MM-dd"
	 * 
	 * @param startTime
	 * @param endTime
	 * @return long[]
	 *         <p>
	 *         long[0] = 天数<br/>
	 *         long[1] = 小时<br/>
	 *         long[2] = 分钟<br/>
	 *         long[3] = 秒
	 *         </p>
	 */
	public static long[] getDateDiff(String startTime, String endTime) {
		return getDateDiff(startTime, endTime, DATE_FORMAT_YYYY_MM_DD);
	}

	/**
	 * 判断两个日期相差的时间
	 * 
	 * @param startTime
	 * @param endTime
	 * @param format
	 * @return long[]
	 *         <p>
	 *         long[0] = 天数<br/>
	 *         long[1] = 小时<br/>
	 *         long[2] = 分钟<br/>
	 *         long[3] = 秒
	 *         </p>
	 */
	public static long[] getDateDiff(String startTime, String endTime,
			String format) {
		SimpleDateFormat sd = new SimpleDateFormat(format);
		long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
		long nh = 1000 * 60 * 60;// 一小时的毫秒数
		long nm = 1000 * 60;// 一分钟的毫秒数
		long ns = 1000;// 一秒钟的毫秒数
		long diff;
		long[] date = new long[4];
		try {
			diff = sd.parse(endTime).getTime() - sd.parse(startTime).getTime();
			long day = diff / nd;// 计算差多少天
			long hour = diff % nd / nh;// 计算差多少小时
			long min = diff % nd % nh / nm;// 计算差多少分钟
			long sec = diff % nd % nh % nm / ns;// 计算差多少秒
			date[0] = day;
			date[1] = hour;
			date[2] = min;
			date[3] = sec;
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}

	/**
	 * 获取格式化日期:默认格式:YYYY-MM-DD
	 * 
	 * @param dateStr
	 * @return Date
	 */
	public static Date getDateFormat(String dateStr) {
		return getDateFormat(dateStr, DATE_FORMAT_YYYY_MM_DD);
	}

	/**
	 * 获取格式化日期:自定义格式
	 * 
	 * @param dateStr
	 *            String 字符型日期
	 * @param format
	 *            String 格式
	 * @return Date
	 */
	public static Date getDateFormat(String dateStr, String format) {
		Date date = null;
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(format);
			date = dateFormat.parse(dateStr);
		} catch (Exception e) {
		}
		return date;
	}

	/**
	 * 格式化输出日期:默认格式:yyyy-MM-dd
	 * 
	 * @param date
	 * @return String
	 */
	public static String getDateFormat(Date date) {
		return getDateFormat(date, DATE_FORMAT_YYYY_MM_DD);
	}

	/**
	 * 格式化输出日期:自定义格式
	 * 
	 * @param date
	 * @param format
	 * @return String
	 */
	public static String getDateFormat(Date date, String format) {
		String result = "";
		try {
			if (date != null) {
				DateFormat dateFormat = new SimpleDateFormat(format);
				result = dateFormat.format(date);
			}
		} catch (Exception e) {
		}
		return result;
	}

	/**
	 * 获取字符型日期:默认格式:yyyy-MM-dd
	 * 
	 * @param date
	 * @return String
	 */
	public static String getDate(Date date) {
		return getDateFormat(date, DATE_FORMAT_YYYY_MM_DD);
	}

	/**
	 * 获取字符型时间:默认格式:HH:mm:ss
	 * 
	 * @param date
	 * @return String
	 */
	public static String getTime(Date date) {
		return getDateFormat(date, DATE_FORMAT_HH_MM_SS);
	}

	/**
	 * 获取字符型日期时间:默认格式:yyyy-MM-dd HH:mm:ss
	 * 
	 * @param date
	 * @return String
	 */
	public static String getDateAndTime(Date date) {
		return getDateFormat(date, DATE_FORMAT_YYYY_MM_DD_HH_MM_SS);
	}

	/**
	 * 日期相减:返回毫秒
	 * 
	 * 返回的 是long 的毫秒
	 * 
	 * @param dateA
	 *            Date 日期
	 * @param dateB
	 *            Date 日期
	 * @return long
	 */
	public static long getDateSub(Date dateA, Date dateB) {
		return ((getMillis(dateA) - getMillis(dateB)) / (24 * 3600 * 1000));
	}

	/**
	 * 获取指定月份的第一天
	 * 
	 * @param dateStr
	 * @return String
	 */
	public static String getFirstDayOfMonth(String dateStr) {
		Date date = getDateFormat(dateStr);
		return getDateFormat(date, "yyyy-MM") + "-01";
	}

	/**
	 * 获取指定月份的最后一天
	 * 
	 * @param dateStr
	 * @return String
	 */
	public static String getEndDayOfMonth(String dateStr) {
		Date date = getDateFormat(getFirstDayOfMonth(dateStr));
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, 1);
		calendar.add(Calendar.DAY_OF_YEAR, -1);
		return getDateFormat(calendar.getTime());
	}

}
